// 导入所需的配置信息和请求头信息
import {
    CONFIG,
    headers_leancloud,
    headers_kimi,
} from "./config";

// 为 uni-app 的请求添加拦截器
uni.addInterceptor("request", {
    // 拦截器的 invoke 函数，在请求被调用时触发
    invoke(options) {
        // 如果请求的 URL 以 CONFIG.leancloud_url 开头
        if (options.url.startsWith(CONFIG.leancloud_url)) {
            // 使用 leancloud 的请求头
            options.header = headers_leancloud;
        }
        // 如果请求的 URL 以 CONFIG.kimi_url 开头
        if (options.url.startsWith(CONFIG.kimi_url)) {
            // 使用 kimi 的请求头
            options.header = headers_kimi;
        }
    }
})


// 自定义的请求函数 $request，封装了 uni.request 并返回一个 Promise
let $request = (url, data, method = 'GET') => {
    // 打印请求的 URL
    console.log("send request:" + url);
    // 在请求之前显示加载中的提示
    uni.showLoading({
        title: "加载中..."
    });
    // 返回一个 Promise，用于处理请求的结果
    return new Promise((resolve, reject) => {
        // 发起请求
        uni.request({
            url,
            data: data || {},
            method,
            success(res) {
                // 如果响应的状态码在 200 到 299 之间，将结果 resolve 出去
                if (res.statusCode >= 200 && res.statusCode < 300) {
                    resolve(res.data);
                } else {
                    // 显示数据获取错误的提示，并将错误信息 reject 出去
                    uni.showToast({
                        icon: 'none',
                        title: '数据获取错误',
                    });
                    reject(res);
                }
            },
            fail(err) {
                // 显示网络错误的提示，并将错误信息 reject 出去
                uni.showToast({
                    icon: 'none',
                    title: '网络错误，请重试。',
                });
                reject(err);
            },
            complete() {
                // 请求完成后隐藏加载中的提示
                uni.hideLoading();
            }
        });
    });
}


// 将 $request 函数挂载到全局的 uni 对象上
uni.$request = $request;


// 基于 $request 函数封装 GET 请求函数，挂载在 uni 对象上
uni.$get = (url, data) => {
    return $request(url, data);
}


// 基于 $request 函数封装 POST 请求函数，挂载在 uni 对象上
uni.$post = (url, data) => {
    return $request(url, data, "POST");
}


// 基于 $request 函数封装 PUT 请求函数，挂载在 uni 对象上
uni.$put = (url, data) => {
    return $request(url, data, "PUT");
}


// 基于 $request 函数封装 DELETE 请求函数，挂载在 uni 对象上
uni.$del = (url, data) => {
    return $request(url, data, "DELETE");
}